#include "Controleur.h"

using namespace std;

Controleur::Controleur()
{
	
}

Controleur::Controleur(Vue* vue, Modele* modele)
{
	m_vue = vue;
	m_modele = modele;
}

void Controleur::deplacer(int x, int y)
{
	int tx = m_modele->getPersonnageX();
	int ty = m_modele->getPersonnageY();
	Case* acces = m_modele->getMap()[ty+y][tx+x];
	//les ifs ne vont pas, on affiche pas les actions pour les escaliers par exemple
	if(!acces->getBloquant())
	{
		m_modele->setPersonnagePosition(x,y);
		m_modele->putPersonnageOnMap();
	}
	else
	{
		cout<<"Vous ne pouvez vous deplacer ici"<<endl;
		m_derniereCoordonnees.first = ty+y;
		m_derniereCoordonnees.second = tx+x;
		ajouterAAjouter(acces);
	}
}

void Controleur::ajouterAAjouter(Case* acces)
{
	vector<bool> listeOk;
	string action = acces->getActionPossible();
	//vector d'action dans le cas ou plusieur actions speciales
	vector<string> actions;
	
	for(int i = 0 ; i < action.length() ; i++)
	{
		if(action[i] == ' ')
		{
			actions.push_back(action.substr(0,i));
			listeOk.push_back(true);
			action = action.erase(0,i+1); //supprime le mot précédent + l'espace
			i = 0; // comme on diminue la taille de l'action, on recommence à compter à 0
		}
	}
	//on rajoute le dernier element
	actions.push_back(action);
	listeOk.push_back(true);
	
	 //~ ne fonctionne pas qvec 1 ok et 1 faux il faut creer une tableau de liste ok
	for(int j = 0 ; j < actions.size() ; j++)
	{
		//permet de verifier que on mets pas 2 fois la meme action dans à ajouter
		for(int i = 0 ; i < m_ajouter.size() ; i++)
		{
			if(actions[j].find(m_ajouter[i]) != string::npos)
				listeOk[j] = false;
		}
		//permet de verifier que on mets pas 2 fois une action dans le menu
		for(int i = 0 ; i < m_modele->getSizeMenu() ; i++)
		{
			if(actions[j].find(m_modele->getElemMenu(i)) != string::npos)
				listeOk[j] = false;
		}
	}
	
	for(int j = 0 ; j < actions.size() ; j++)
	{
		if(actions[j] != "" && listeOk[j])
			m_ajouter.push_back(actions[j]);
	}
}

void Controleur::effacerAjouter()
{
	m_ajouter.clear();
}

void Controleur::faireAction()
{
	cout<<"BUG"<<endl;
}

void Controleur::enVue()
{
	int tx = m_modele->getPersonnageX();
	int ty = m_modele->getPersonnageY();

	for(int i = 0 ; i < m_modele->getMapDimension(false) ; i++)
	{
		for(int j = 0 ; j < m_modele->getMapDimension(true) ; j++)
		{
			Case* tmp = m_modele->getMap()[i][j];
			if(tmp->getBloquant())
			{
				if(i>=ty)//si sur les y, le perso est plus haut que l'objet
				{
					if(j>=tx) // si sur les x le perso est plus proche de 0
					{
						int x=j,y=i,ix=j-tx,iy=i-ty;
						int res = ((ix*iy)/2)-1;
						int cpt=0;
						int x0;
						while(y < m_modele->getMapDimension(false))
						{
							while(x < m_modele->getMapDimension(true))
							{
								if(x0<ix*cpt)
								{
									m_modele->getMap()[y][x]->setVisible(false);
									
								}
								x++;
								cpt++;
							}
							y++;
						}
						//~ i = 100;
						//~ j=100;	
					}
				}
				if(i>=ty)//si sur les y, le perso est plus haut que l'objet
				{
					if(j<=tx) // si sur les x le perso est plus loin de 0
					{
						//~ int x=j,y=i;
						//~ while(y < m_modele->getMapDimension(false))
						//~ {
							//~ while(x > 0)
							//~ {
								//~ tmp = m_modele->getMap()[y][x];
								//~ if(!tmp->getBloquant())
								//~ {
									//~ m_modele->getMap()[y][x]->setVisible(false);
								//~ }
								//~ x--;
							//~ }
							//~ y++;
						//~ }
					}
				}
				if(i<=ty)//si sur les y, le perso est plus bas que l'objet
				{
					if(j>=tx)
					{
						//~ int x=j+1,y=i+1;
						//~ while(y > 0)
						//~ {
							//~ while(x < m_modele->getMapDimension(true))
							//~ {
								//~ m_modele->getMap()[y][x]->setVisible(false);
								//~ x++;
							//~ }
							//~ y--;
						//~ }
					}
				}
				if(i<=ty)//si sur les y, le perso est plus bas que l'objet
				{
					if(j<=tx)
					{
						//~ int x=j+1,y=i+1;
						//~ while(y > 0)
						//~ {
							//~ while(x > 0)
							//~ {
								//~ m_modele->getMap()[y][x]->setVisible(false);
								//~ x--;
							//~ }
							//~ y--;
						//~ }
					}
				}
			}
		}
	}
}

//permet de securiser le menu contre des actions non disponibles
bool Controleur::actionDisponible(int action)
{
	vector<string> menuTmp;
	int i = 0, cpt = 0;
	bool ok = true;
	int j = 0;
	
	//stocke les elements affichés
	for(i = 0 ; i < m_modele->getSizeMenu() ; i++)
	{
		menuTmp.push_back(m_modele->getElemMenu(i));
	}
	//Permet de ne garder que les numeros affichers de l'action
	while(j < menuTmp.size())
	{
		i=0;
		while(i<menuTmp[j].length() && ok)
		{
			if(menuTmp[j][i]=='.')
			{
				menuTmp[j] = menuTmp[j].substr(0,cpt);
				cpt = 0;
				ok = false;
			}
			else
				cpt++;
			i++;
		}
		j++;
		ok = true;
	}
	//convertit int to string
	string verification;
	stringstream out;
	out << action;
	verification = out.str();
	
	bool correspond = false;
	for(int i = 0 ; i < menuTmp.size() ; i++)
	{
		if(verification == menuTmp[i])
			correspond = true;
	}
	return correspond;
}
